#include <buola/gui.h>

#include <buola/gui/cicon.h>

#include <buola/widgets/csblist.h>

namespace buola { namespace gui {

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////// CSBItem /////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

CSBItem::CSBItem(CSBList *pList)
{
	mList=pList;
	mSelected=false;
	mIcon=nullptr;
}

int CSBItem::SortAscending(const void *p1,const void *p2)
{
	CSBItem *l1=*((CSBItem* const*)p1);
	CSBItem *l2=*((CSBItem* const*)p2);

	return (l1->mText.compare(l2->mText));
}

int CSBItem::SortDescending(const void *p1,const void *p2)
{
	CSBItem *l1=*((CSBItem* const*)p1);
	CSBItem *l2=*((CSBItem* const*)p2);

	return (-l1->mText.compare(l2->mText));
}

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
////////////////////////// CSBList //////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

CSBItem *CSBList::GetItem(int pIndex)
{
    int lCount=mSBI.size();
    for(int i=0;i<lCount;i++)
        if(mSBI[i]->mIndex==pIndex)
            return mSBI[i];
    return nullptr;
}

void CSBList::SBCopy(CSBList *pOther)
{
	for(int i=0;i<pOther->mSBI.size();i++)
	{
		mSBI.push_back(pOther->mSBI[i]);
	}
	mSBNextIndex=pOther->mSBNextIndex;
}

CSBItem *CSBList::AddItem(const std::wstring &pName,PIcon pIcon,int pIndex)
{
	CSBItem *lNew=new CSBItem(this);

	if(pIndex<0) pIndex=mSBNextIndex++;

	lNew->mIndex=pIndex;
	lNew->mText=pName;
	lNew->mIcon=pIcon;
//	lNew->mType=VALUE_STRING;

	mSBI.push_back(lNew);

	OnItemAdded(lNew);

	return lNew;
}

bool CSBList::RemoveItem(int pIndex)
{
	CSBItem *lItem=GetItem(pIndex);
	if(!lItem) return false;
	delete lItem;
	mSBI.erase(std::find(mSBI.begin(),mSBI.end(),lItem));

	return true;
}

void CSBList::RemoveAllItems()
{
	for(int i=0;i<mSBI.size();i++)
	{
		delete mSBI[i];
	}

	mSBI.clear();
}

void CSBList::SetItemText(int pIndex,const std::wstring &pString)
{
	CSBItem *lItem=GetItem(pIndex);
	if(lItem)
	{
		lItem->mText=pString;
		OnItemChanged(lItem);
	}
}

std::wstring CSBList::GetItemText(int pIndex)
{
	CSBItem *lItem=GetItem(pIndex);
	if(lItem)
		return lItem->mText;
    return(std::wstring());
}

CSBItem *CSBList::FindItem(const std::wstring &pText)
{
	int lCount=GetItemCount();
	for(int i=0;i<lCount;i++)
		if(mSBI[i]->mText==pText)
			return mSBI[i];
	return nullptr;
}


/*namespace gui*/ } /*namespace buola*/ }
